package com.sky.api.config;

import com.sky.api.client.fallback.ProductFallbackFactory;
import com.sky.api.client.fallback.TradeFallbackFactory;
import com.sky.api.client.fallback.UserFallbackFactory;
import com.sky.common.context.BaseContext;
import feign.Logger;
import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean;

/**
 * @author toki
 */
public class DefaultFeignConfig {

    /**
     * 信息传递： 微服务A -> 微服务B
     *  配置feign拦截器，将登录用户信息传递给下游微服务
     *  实现微服务之间通过OpenFeign调用时也能传递登录用户信息
    * */
    @Bean
    public RequestInterceptor userInfoRequestInterceptor(){
        return template -> {
//            // 传递令牌，用于远程调用时校验权限
//            List<String> token = (List<String>) template.headers().get("token");
//            if(token.get(0) != null &&!token.get(0).isEmpty()) {
//                // 如果不为空则放入请求头中，传递给下游微服务
//                template.header("token", token.get(0));
//            }
//            List<String> authentication = (List<String>) template.headers().get("authentication");
//            if(authentication.get(0) != null &&!authentication.get(0).isEmpty()) {
//                // 如果不为空则放入请求头中，传递给下游微服务
//                template.header("authentication", authentication.get(0));
//            }
            // 获取登录用户
            Long userId = BaseContext.getCurrentId();
            if(userId == null) {
                // 如果为空则直接跳过
                return;
            }
            // 如果不为空则放入请求头中，传递给下游微服务
            template.header("user-info", userId.toString());
            template.header("admin-info", userId.toString());
        };
    }

    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

    @Bean
    public ProductFallbackFactory productFallbackFactory() {
        return new ProductFallbackFactory();
    }

    @Bean
    public TradeFallbackFactory tradeFallbackFactory() {
        return new TradeFallbackFactory();
    }

    @Bean
    public UserFallbackFactory userFallbackFactory() {
        return new UserFallbackFactory();
    }
}
